package block

import (
	"bytes"
	"errors"
	"github.com/boltdb/bolt"
)

/**
 *@author:zhengyilong
 *@email:1797344574@qq.com
 *@phone:13479394730
 *@DateTime:2022/3/14 9:37
 **/

type ChainIterator struct {
	DB *bolt.DB
	//标志位，表示当前迭代器所迭代的位置
	CurrentHash []byte
}

//使用迭代器找上一个区块，因为是从后向前找区块的
func (iterator *ChainIterator)Next() (*Block,error) {
	var block *Block
	var err error
	//view方法，同一时间允许多个人进行查看数据
	err = iterator.DB.View(func(tx *bolt.Tx) error {
		//打开桶
		bk := tx.Bucket([]byte(BUCKET_BLOCK))
		if bk == nil {
			return errors.New("没有桶")
		}

		//获取桶内的值,最后一个区块的信息
		blockBytes := bk.Get(iterator.CurrentHash)

		//获取最后一个区块的prevhash
		//进行反序列化
		block, err = DeSerialize(blockBytes)
		if err!=nil {
			return errors.New("反序列化失败")
		}

		iterator.CurrentHash = block.PrevHash

		return nil
	})

	return block,err
}

//判断是否还有下一个区块
func (iterator *ChainIterator) HasNext() bool {
	int := bytes.Compare(iterator.CurrentHash, nil)
	return int != 0
}